package com.feri.api.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.feri.api.config.SystemConfig;
import com.feri.api.dao.UserlevelDao;

import com.feri.api.dao.UsermsgDao;
import com.feri.api.service.intf.UserlevelService;
import com.feri.api.vo.R;
import com.feri.common.entity.Userlevel;
import com.feri.common.entity.Usermsg;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.sql.SQLException;
import java.util.Date;

/**
 * ━━━━━━神兽出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　 ┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　  ┃
 * 　　┃　　　　　　 ┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛Code is far away from bug with the animal protecting
 * 　　　　┃　　　┃    神兽保佑,代码无bug
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━永无BUG!━━━━━━
 *
 * @Description:
 * @Author: 学习强国
 * @Date: 2022/10/02 13:26:55
 */
@Service
public class UserlevelServiceImpl implements UserlevelService {
    private final UserlevelDao dao;
    private final UsermsgDao msgDao;

    public UserlevelServiceImpl(UserlevelDao dao, UsermsgDao msgDao) {
        this.dao = dao;
        this.msgDao = msgDao;
    }

    /**
     * 凡是积分变动的时候，都需要调用本方法
     * 开启事务*/
    @Override
    @Transactional(rollbackFor = SQLException.class)
    public int updateLevel(long uid, long score) {
        //1.查询对应的用户等级
        Userlevel userlevel=dao.selectOne(new QueryWrapper<Userlevel>().eq("uid",uid));
        //2.验证是否存在
        if(userlevel!=null){
            //3.修改积分
            userlevel.setScore(userlevel.getScore()+score);
            //4.验证是否是奖励积分
            if(score>0){
                //5.新增经验
                userlevel.setExpire(userlevel.getExpire()+score);
                //6.验证等级是否升级
                //等级 要求的积分范围 10 的等级+1次幂
                if(userlevel.getExpire()>Math.pow(10,userlevel.getLevel()+1)){
                    //7.改升级了
                    userlevel.setLevel(userlevel.getLevel()+1);
                    userlevel.setLevelmsg(SystemConfig.levels[userlevel.getLevel()-1]);
                    //8.发送系统消息
                    Usermsg usermsg = new Usermsg();
                    usermsg.setUid(userlevel.getUid());
                    usermsg.setType(2);
                    usermsg.setInfo("恭喜你，升级到了"+userlevel.getLevelmsg()+",继续加油哦！");
                    usermsg.setCtime(new Date());
                    msgDao.insert(usermsg);
                }
            }
            //改变数据库
            return dao.updateById(userlevel);
        }
        return 0;
    }

    @Override
    public R queryAll() {
        return R.ok(dao.selectList(null));
    }
}